<?php

namespace library\configuration;

/**
 * <p>klasa obsługująca sterownik ini</p>
 * @author Damian Jóźwiak
 */
class Ini extends Driver{
    
    /**
     * <p>funkcja zwraca hierarchiczny obiekt typu StdClass zawierający konfiguracje</p>
     * <p>plik ini wymaga notacji kropkowej<br>
     * np następująca linia w pliku ini <b>default.database.user=user</b> da w wyniku <br>
     * <b> default->database->user </b></p>
     * @param string $path <p>ścieżka do pliku ini</p>
     * @return \StdClass
     * @throws \library\exceptions\ExceptionWrongPath <p>w przypadku błędnej ścieżki do pliku konfiguracji</p>
     * @throws \library\exceptions\ExceptionConfigurationSyntax<p>w przypadku błędnej składni pliku ini</p>
     */
    public function parse($path){
        if (empty($path)){
            throw new \library\exceptions\ExceptionWrongPath();
        }
        if (!file_exists($path.".ini")){
            throw new \library\exceptions\ExceptionWrongPath("{$path} nie jest ścieżką do pliku konfiguracyjnego");
        }
        if (!isset($this->parsed[$path])){
            
            $config = array();
            ob_start();
            include ("{$path}.ini");
             $string = ob_get_contents();
             ob_end_clean();
             $pairs = \parse_ini_string($string);
             if ($pairs ==false){
                 throw new \library\exceptions\ExceptionConfigurationSyntax();
             }
             foreach ($pairs as $key => $value) {
                 $config = $this->_pair($config,$key,$value);
             }
             $this->parsed[$path] = \library\ArrayMethods::toObject($config);
        }
        return $this->parsed[$path];
        
    }
    protected function _pair($config,$key,$value){
            if (strstr($key, ".")){
                $parts = explode(".", $key,2);
                if(empty($config[$parts[0]])){
                    $config[$parts[0]] = array();
                }
                 $config[$parts[0]] = $this->_pair($config[$parts[0]], $parts[1], $value);
            }
            else{
                $config[$key]=$value;
            }
            return $config;
     }
}
